package com.sztx.pay.center.rpc.api.service;

import java.util.List;

import com.sztx.pay.center.rpc.api.domain.ActBanlanceResponse;
import com.sztx.pay.center.rpc.api.domain.BindCardInfo;
import com.sztx.pay.center.rpc.api.domain.BindCardRequest;
import com.sztx.pay.center.rpc.api.domain.PageModelResponse;
import com.sztx.pay.center.rpc.api.domain.QueryBanlanceListResponse;
import com.sztx.pay.center.rpc.api.domain.QueryMerBindCardRequest;
import com.sztx.pay.center.rpc.api.domain.ResponsePageModel;
import com.sztx.pay.center.rpc.api.domain.UserAccountInfoResponse;
import com.sztx.pay.center.rpc.api.domain.UserActInfo;
import com.sztx.pay.center.rpc.api.domain.UserActInfoResponse;
import com.sztx.pay.center.rpc.api.domain.UserInfoRequest;
import com.sztx.pay.center.rpc.api.domain.UserInfoResponse;

public interface AccountRpcService {
	
	/**
	 * 创建支付账户
	 * <br>普通用户和代理商用户只能创建余额账户、商城商户能创建余额账户和返利金账户
	 * @param userId    Y   用户id(berbonId)
	 * @param userType  Y   用户类别（1普通用户、2代理商用户、3商城商户）
	 * @param actType   Y   需要创建的账户类别（1余额账户、2返利金账户）仅userType=2才能创建返利金账户
	 * @param mobileNo  N   手机号
	 * @param attach    N   备注
	 * @return     返回账号id
	 * @author xiaosc
	 * @date 2016-1-11 下午9:51:41 
	 * @see [类、类#方法、类#成员]
	 */
	String createAct(String userId, Integer userType, Integer actType, String mobileNo, String attach);
	/**
	 * 创建平台帐号
	 * @param userId
	 * @param userType
	 * @param actType
	 * @param mobileNo
	 * @param attach
	 * @return
	 */
//	String createAct2(String userId, int userType, int actType, String mobileNo, String attach,String lastOperator,int actState);
	
	
	/**
	 * 查询账户余额
	 * 
	 * @param userId    Y   用户id(berbonId)
	 * @param actType   N   账户类别（1余额账户、2返利金账户）,默认为余额账户
	 * @return   返回账户余额
	 * @author xiaosc
	 * @date 2016-1-11 下午9:58:19 
	 * @see [类、类#方法、类#成员]
	 */
	int queryBalance(String userId, Integer actType);
	/**
	 * 查询账户余额
	 * 
	 * @param userId    Y   用户id(berbonId)
	 * @param actType   N   账户类别（1余额账户、2返利金账户）,默认为余额账户
	 * @return   返回账户余额
	 * @author xiaosc
	 * @date 2016-1-11 下午9:58:19 
	 * @see [类、类#方法、类#成员]
	 */
	ActBanlanceResponse queryAllBalance(String userId, Integer actType);
	
	/**
	 * 冻结账户余额
	 * 
	 * @param userId    Y  		用户id(berbonId) 
	 * @param actType   Y    账户类别 
	 * @param operator  Y  		操作人
	 * @param attach    N       备注
	 * @return
	 * @author xiaosc
	 * @date 2016-1-11 下午10:03:40 
	 * @see [类、类#方法、类#成员]
	 */
	boolean freezedBalance(String userId, Integer actType, String operator, String attach);
	
	/**
	 * 解冻用户余额账户
	 * 
	 * @param userId     Y    用户id(berbonId) 
	 * @param actType    Y    账户类别 
	 * @param operator   Y    操作人
	 * @param attach     N    备注
	 * @return
	 * @author xiaosc
	 * @date 2016-1-11 下午10:03:48 
	 * @see [类、类#方法、类#成员]
	 */
	boolean unfreezeBalance(String userId, Integer actType, String operator, String attach);
	
	/**
	 * 冻结账户部分余额
	 * @param userId    Y    用户id(berbonId) 
	 * @param actType   Y    账户类别 
	 * @param amount    Y    冻结金额
	 * @param operator  Y    操作人
	 * @param attach    N    备注
	 * @return
	 */
	boolean freezeMoney(String userId, Integer actType, long amount, String operator, String attach);
	
	/**
	 * 解冻账户部分余额
	 * @param userId	Y    用户id(berbonId) 
	 * @param actType	Y    账户类别
	 * @param amount	Y    解冻结金额
	 * @param operator	Y    操作人
	 * @param attach	N    备注
	 * @return
	 */
	boolean unfreezeMoney(String userId, Integer actType, long amount, String operator, String attach);
	
	/**
	 * 绑定快捷支付卡、提现卡、提现支付宝
	 * 
	 * @param request
	 * @return
	 * @author xiaosc
	 * @date 2016-1-12 上午10:44:13 
	 * @see [类、类#方法、类#成员]
	 */
	String bindCard(BindCardRequest request);
	
	/**
	 * 查询在用户绑定快捷支付银行卡时需要该绑定卡所支付的费用（如果有支付的费用，则该扣出的费用会转到用户的余额中）
	 * 
	 * @return
	 * @author xiaosc
	 * @date 2016-1-12 上午10:47:23 
	 * @see [类、类#方法、类#成员]
	 */
	int queryBindCardFree(String cardNo);
	
	/**
	 * 解绑银行卡
	 * 
	 * @param userId
	 * @param bindNo
	 * @return
	 * @author xiaosc
	 * @date 2016-1-12 下午3:39:37 
	 * @see [类、类#方法、类#成员]
	 */
	boolean unbindCard(String userId, String bindNo);
	
	/**
	 * 设置银行卡主卡
	 * 
	 * @param userId
	 * @param bindNo
	 * @return
	 * @author xiaosc
	 * @date 2016-1-12 下午3:39:30 
	 * @see [类、类#方法、类#成员]
	 */
	boolean setPrimaryCard(String userId, String bindNo);
	
	/**
	 * 查询已绑定的支付账号
	 * 
	 * @param userId       用户id(berbonId)
	 * @param bindType     绑定类别（0不限，1快捷支付，2提现银行卡, 3提现支付宝）
	 * @return
	 * @author xiaosc
	 * @date 2016-1-12 下午4:26:07 
	 * @see [类、类#方法、类#成员]
	 */
	List<BindCardInfo> queryBindCardList(String userId, int bindType);
	
	/**
	 * 快捷支付绑卡验证短信
	 * 
	 * @param bindNo         绑定号
	 * @param verifyCode     验证码
	 * @return
	 * @author xiaosc
	 * @date 2016年2月29日 下午2:36:21 
	 * @see [类、类#方法、类#成员]
	 */
	boolean verifyBindCard(String bindNo, String verifyCode);
	
	/**
	 * 重新发送绑卡验证码
	 * 
	 * @param bindNo
	 */
	boolean resendVerifyCode(String bindNo);
	
	/**
	 * 账户迁移
	 * <br>用于支付分离将老用户迁移到新系统
	 * @param userId
	 * @param isRealName
	 * @param mobileNo
	 * @param realName
	 * @param identifyNo
	 * @return
	 * @author xiaosc
	 * @date 2016年2月29日 下午2:36:16 
	 * @see [类、类#方法、类#成员]
	 */
	String transferUser(String userId,Integer userType, Integer isRealName, String mobileNo, String realName, String identityNo);
	
	/**
	 * 账户迁移2
	 * <br>用于支付分离将老用户迁移到新系统
	 * @param userId
	 * @param isRealName
	 * @param mobileNo
	 * @param realName
	 * @param identifyNo
	 * @return
	 * @author xiaosc
	 * @date 2016年2月29日 下午2:36:16 
	 * @see [类、类#方法、类#成员]
	 */
	String transferUser(String userId,Integer userType, Integer isRealName, String mobileNo, String realName, String identityNo,String lastOperator,String remark);
	
	/**
	 * 账户实名认证
	 * 
	 * @param userId
	 * @param actLevel
	 * @param mobileNo
	 * @param realName
	 * @param identityNo
	 * @return
	 * @author xiaosc
	 * @date 2016年2月29日 下午2:36:10 
	 * @see [类、类#方法、类#成员]
	 */
	boolean realAuth(String userId, Integer actLevel, String mobileNo, String realName, String identityNo);
	
	
	boolean changeUserType(String userId, Integer userType, String attach);
	/**
	 * 查询用户绑卡信息
	 * @param bindNo
	 * @return
	 */
	BindCardInfo findCardInfoByBindNo(String bindNo);
	
	/**
	 * 获取用户最近使用的存储卡
	 * @param userId
	 * @return
	 */
	BindCardInfo findLastPayCardInfo(String userId,int type);
	/**
	 *  获取用户最近支付方式
	 * @param userId
	 * @return
	 */
	Integer findLastPayType(String userId);
	
	/**
	 * 批量查询用户基本信息
	 * @param userId
	 * @param actType
	 * @return
	 * 1, "通付账户"
	 * 2, "现金账户"
	 * 4, "交易账户"
	 * 8, "缴费金账户"
	 */
	List<UserActInfoResponse> queryUserActInfo(String userId,List<Integer> userActTypeList);
	
	/**
	 * 根据帐号查询账户信息
	 * @param userId
	 * @return
	 */
	UserActInfoResponse queryUserActInfo(String userId);
	
	/**
	 * 查询用户账户信息
	 * @param userId
	 * @param actType
	 * @return
	 */
//	UserAccountInfoResponse queryUserAccountInfo(String userId,String actType);
//	
//	/**
//	 * 查询商户余额汇总列表总数
//	 * @param userId
//	 * @return
//	 */
//	Integer queryAgentActCount(String userId);
//	
//	/**
//	 * 查询商户余额汇总
//	 * @param userId
//	 * @param pageNo
//	 * @param pageSize
//	 * @return
//	 */
//	List<UserActInfoResponse> queryAgentActList(String userId,int pageNo,int pageSize);
	
	/**
	 * 查询用户是否做了有效
	 * @param userId
	 * @return
	 */
	boolean checkUserValid(String userId);
	
	UserAccountInfoResponse queryUserAccountInfo(String userId);
	
	/**
	 * 查询商户余额汇总列表总数
	 * @param userId
	 * @return
	 */
	Integer queryAgentActCount(String userId);
	
	/**
	 * 查询商户余额汇总
	 * @param userId
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
	List<UserActInfoResponse> queryAgentActList(String userId,int pageNo,int pageSize);	
	
	/**
	 * 查询对公银行卡列表
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
	ResponsePageModel<BindCardInfo> queryMerCardList(QueryMerBindCardRequest request);
	/**
	 * 更新对公银行卡信息
	 * @param bindCardNo
	 * @param request
	 * @return
	 */
	void updateMerCard(String userId,String bindCardNo,BindCardRequest request);
	
	/**
	 * 查询用户列表
	 * @param userType
	 * @param actType
	 * @param userId
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
	ResponsePageModel<UserActInfoResponse> queryUserActList(String userId,String mob,String identifyNo,String realName,int pageNo,int pageSize);
	/**
	 * 修改账户信息
	 * @param userId
	 * @param remark
	 * @param actState
	 * @param lastOperator
	 * @param actType
	 */
	void modifyUserAct(String userId,String remark,int actState,String lastOperator,int actType);
	
	/**
	 * 修改用户信息
	 * @param userId
	 * @param remark
	 * @param actState
	 * @param lastOperator
	 */
	void modifyUserInfo(String userId,String remark,int actState,String lastOperator);
	
	/**
	 * 批量查询用户余额
	 * @param userIds
	 * @param actType
	 * @return
	 */
	List<QueryBanlanceListResponse> queryBanlanceList(List<String> userIds,Integer actType);
	
	/**
	 * 灰度支付用户
	 * @param userId      用户berbonId
	 * @param operator    操作人
	 * @param remark        备注
	 */
	void grayUser(String userId, String operator, String remark);
	
	/**
	 * 同步用户通付余额
	 * @param userId
	 * @return
	 */
	boolean syncUserBalance(String userId);

	/**
	 * 实名认证通付账户
	 * @param userId
	 * @param realName
	 * @param identityNo
	 * @param mobileNo
	 * @return
	 */
	boolean realNameTfAct(String userId, String realName,String identityNo, String mobileNo);

	/**
	 * 更新灰度状态
	 * @param userId
	 * @param newGraySate
	 * @return
	 */
	boolean changeGrayState(String userId, Integer newGraySate);
	/**
	 * 同步通付绑定银行卡
	 * @param userId
	 * @return
	 */
	boolean syncBindCard(String userId);
	
	
	UserActInfo queryUserActAllInfo(String userId);
	
	
	PageModelResponse<UserInfoResponse> queryUserActList(UserInfoRequest request,int pageNo,int pageSize);
}
